#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>
#include "parser.h"
#include "utilidades.h"

/*
 * Función auxiliar para imprimir si estuvo OK o no.
 */
void print_test(char* name, bool result){
    printf("%s: %s\n", name, result? "OK" : "ERROR");
}




void prueba_parsear_archivo_con_dos_palabras_distintas(){
		
	FILE* arch_prueba = fopen("#","w");
	fprintf(arch_prueba,"probando algo\n");
	fclose(arch_prueba);
	
	parsear_archivo("#",10000,0,2,0);
	
	FILE* resultado = fopen("subarchivo-0.subarch","r");
	
	char* linea = leer_linea(resultado);
	
	bool flag=true;
	
	if (strcmp(linea,"algo,00000,1")!=0)
		flag=false;
	
	free(linea);
	linea = leer_linea(resultado);
	free(linea);
	linea = leer_linea(resultado);
	free(linea);
	linea = leer_linea(resultado);
	
	if (strcmp(linea,"probando,00000,1")!=0)
		flag=false;
	
	free(linea);
	fclose(resultado);
	
	print_test("Prueba parsear archivo con dos palabras distintas",flag);
	

	remove("subarchivo-0.subarch");
	remove("#");
	
}


void prueba_parsear_archivo_con_dos_palabras_iguales(){
		
	FILE* arch_prueba = fopen("#","w");
	fprintf(arch_prueba,"probando probando\n");
	fclose(arch_prueba);
	
	parsear_archivo("#",10000,0,2,0);
	FILE* resultado = fopen("subarchivo-0.subarch","r");
	
	char* linea = leer_linea(resultado);
	
	fclose(resultado);
	
	print_test("Prueba parsear archivo con dos palabras iguales",strcmp(linea,"probando,00000,2")==0);
	
	free(linea);
	remove("subarchivo-0.subarch");
	remove("#");
	
}

void prueba_parsear_archivo_con_varias_palabras_iguales(){
		
	FILE* arch_prueba = fopen("#","w");
	fprintf(arch_prueba,"probando probando creo anda anda");
	fclose(arch_prueba);
	
	parsear_archivo("#",10000,0,2,0);
	
	FILE* resultado = fopen("subarchivo-0.subarch","r");
	
	char* linea = leer_linea(resultado);
	
	bool flag=true;
	
	//Verifico linea a linea, harcoding like a boss
	if (strcmp(linea,"anda,00000,2")!=0)
		flag=false;
	
	free(linea);
	linea = leer_linea(resultado);
	free(linea);
	linea = leer_linea(resultado);
	free(linea);
	linea = leer_linea(resultado);
	
	if (strcmp(linea,"creo,00000,1")!=0)
		flag=false;
	

	free(linea);
	linea = leer_linea(resultado);
	free(linea);
	linea = leer_linea(resultado);
	free(linea);
	linea = leer_linea(resultado);
	
	if (strcmp(linea,"probando,00000,2")!=0)
		flag=false;
	
	free(linea);
	
	fclose(resultado);
	
	print_test("Prueba parsear archivo con varias palabras y algunas iguales",flag);
	
	remove("subarchivo-0.subarch");
	remove("#");
	
}


double mi (int total, int Fxy, int Fx, int Fy){

	return (double)(log( ( (double) total * Fxy) / (double)(Fx * Fy) ) / log(2));
}

void prueba_calcular_MI(){

	FILE* arch_prueba = fopen("#","w");
	fprintf(arch_prueba,"como como como como hola hola hola chau");
	fclose(arch_prueba);

	double resultados [4];
	
	resultados[0] =  mi(7,3,4,4);
	resultados[1] =  mi(7,1,4,3);
	resultados[2] =  mi(7,1,3,1);
	resultados[3] =  mi(7,2,3,3);
	
	
		
	double* vector = parsear_archivo_para_probar_mi("#",10000,400,2);

	bool flag=true;
	
	for(int i=0; i<4; i++){
		if (vector[i]!=resultados[i]) flag = false;
	}
	
	print_test("Prueba calcular MI",flag);
	
	free(vector);
	remove("#");
	
}


/*
void prueba_parsear_archivo_y_que_se_termine_la_memoria_con_2_palabras(){
		
	FILE* arch_prueba = fopen("#","w");
	fprintf(arch_prueba,"probando probando");
	fclose(arch_prueba);
	
	parsear_archivo("#",1,0);
	
	FILE* resultado = fopen("subarchivo-0","r");
	bool flag=true;
	char* linea = leer_linea(resultado);
	if (strcmp(linea,"probando,#,1")!=0)
		flag=false;
	free(linea);
	fclose(resultado);
	
	resultado = fopen("subarchivo-1","r");
	flag=true;
	linea = leer_linea(resultado);
	if (strcmp(linea,"probando,#,1")!=0)
		flag=false;
	free(linea);
	fclose(resultado);
	
	print_test("Prueba parsear archivo con memoria limitada y dos palabras",flag);
	
	
	remove("subarchivo-0");
	remove("subarchivo-1");
	remove("#");
	
}
*/
/*
void prueba_parsear_archivo_y_que_se_termine_la_memoria_con_varias_palabras(){
		
	FILE* arch_prueba = fopen("#","w");
	fprintf(arch_prueba,"probando probando avl avl es es es raro");
	fclose(arch_prueba);
	
	parsear_archivo("#",2,0); //Nombre archivo, memoria maxima, primer subarchivo
	
	FILE* resultado = fopen("subarchivo-0","r");
	bool flag=true;
	char* linea = leer_linea(resultado);
	
	if (strcmp(linea,"avl,#,1")!=0)
		flag=false;
	free(linea);
	
	linea = leer_linea(resultado);
	if (strcmp(linea,"probando,#,2")!=0)
		flag=false;
	free(linea);
	fclose(resultado);
	
	resultado = fopen("subarchivo-1","r");

	linea = leer_linea(resultado);
	if (strcmp(linea,"avl,#,1")!=0)
		flag=false;
	free(linea);
	
	linea = leer_linea(resultado);
	if (strcmp(linea,"es,#,1")!=0)
		flag=false;
	free(linea);
	
	fclose(resultado);
	
	resultado = fopen("subarchivo-2","r");

	linea = leer_linea(resultado);
	if (strcmp(linea,"es,#,2")!=0)
		flag=false;
	free(linea);

	linea = leer_linea(resultado);
	if (strcmp(linea,"raro,#,1")!=0)
		flag=false;
	free(linea);
	
	fclose(resultado);


	
	print_test("Prueba parsear archivo con memoria limitada y varias palabras",flag);
	
	
	remove("subarchivo-0");
	remove("subarchivo-1");
	remove("subarchivo-2");
	remove("#");
	
}
*/





/* 
   ESTA PRUEBA ES VISUAL, es medio paja hardcodear todo; una vez corridas,
   mirar archivo subarchivo-0 
*/
void prueba_parsear_archivo_volumen_sin_terminar_memoria(){
	FILE* arch_prueba = fopen("#","w");
	fprintf(arch_prueba,"Cranberry is an unincorporated community in Avery County, North Carolina, United States. The community was founded in 1850 and was named after Cranberry Creek, which flows in the area. The community is located one mile south from the town of Elk Park, along US 19-E.");
	fclose(arch_prueba);
	parsear_archivo("#",1024*1024,4,4,0);

	remove("#");
}


void prueba_parsear_varios_archs_para_desp_probar_merge(){
	parsear_archivo("./testFiles/british.txt",1024*1024,0,2,0);

}


	
void prueba_parser(){
	prueba_parsear_archivo_con_dos_palabras_distintas();
	prueba_parsear_archivo_con_dos_palabras_iguales();
	prueba_parsear_archivo_con_varias_palabras_iguales();
	//prueba_parsear_archivo_y_que_se_termine_la_memoria_con_2_palabras();
	//prueba_parsear_archivo_y_que_se_termine_la_memoria_con_varias_palabras();
	prueba_parsear_archivo_volumen_sin_terminar_memoria();
	prueba_parsear_varios_archs_para_desp_probar_merge();
	prueba_calcular_MI();
}


int main (){
    prueba_parser();
    return 0;
}
